perm filename FSTDAC.MAC[COL,LCS] blob sn#104312 filedate 1974-05-25 generic text, type T, neo UTF8
	NUM=↑D8		;NUMBER OF 128 WORD BLOCKS PER BUFFER
	TITLE	FSTDAC		;NICHOLAS VITULLI COLGATE U. 1973
	EXTERN	FNAM,FILBRK		;ROUTINE TO GET INPUT FILE
	INTERN	DEV			;NAME (DAVID HOFFMAN COLGATE)
	SIZE=200*NUM		;TOTAL SIZE OF EACH BUFFER
	STATUS=004000		;INTERRUPTS ON
	OFF=0		;STATUS BITS FOR DAC
	DONE=10
	BUSY=20
	MISS=40
	T=1		;TEMP ACC
	I=2		;ACC TO HOLD RELOCATION FACTOR
	SETUP=4		;ACC USED FOR INITIAL SETUP
	DSK=5		;INPUT CHANNEL
	B1=11		;RELOCATED IOWD FOR BUFFER 1
	B2=12		;RELOCATED IOWD FOR BUFFER 2
	IB1=13		;IOWD FOR BUFFER 1
	IB2=14		;IOWD FOR BUFFER 2
	IO=7		;ACC FOR TTY INPUT
INDEX:	0		;SAVE RELOCATION FACTOR
SAVET:	0		;SAVE ACC T DURING INTERRUPT ROUTINE
MFLG:	0		;FLAG FOR DATA MISSED
DFLG:	0		;FLAG FOR DONE
TPOINT:	0		;NEXT IOWD FOR INTERRUPT ROUTINE
WHATBF:	0		;BUFFER POINTER 0=BUFFER 2 -1=BUFFER 1
INTBLK:	4,INTLOC		;↑C BLOCK
	2
	0
	0
ADD1:	0		;INTERRUPT ROUTINE
EXCHWD:	EXCH	I,INDEX		;GET RELOCATION FACTOR AND SAVE I
	MOVEM	T,SAVET(I)		;SAVE T
	SETCMM	WHATBF(I)		;POINT WHATBF TO NEXT BUFFER
	SKIPN	T,TPOINT(I)		;GET NEXT IOWD (RELOCATED)
	JRST	NODATA(I)		;IF 0 NO IOWD READY
	SETZM	TPOINT(I)		;ZERO IOWD
	MOVEM	T,POINTR(I)		;RESTORE BLKO POINTER
RETURN:	MOVE	T,SAVET(I)		;RESTORE T
	EXCH	I,INDEX(I)		;RESTORE I AND INDEX
JENWD:	JRSTF	@ADD1		;DISMISS INTERRUPT
NODATA:	CONSZ	200,MISS		;CHECK FOR DATA MISSED
	SETOM	MFLG(I)			;YES RAISE MISSED FLAG
	CONO	200,OFF			;TURN OFF DAC
	SETOM	DFLG(I)			;RAISE DONE FLAG
	JRST	RETURN(I)		;RESTORE AND DISMISS
ADD2:	0		;APR TRAP (ASSUME NEVER TO GET HERE)
BP1:	BLOCK	2		;IOWD FOR BF1
BP2:	BLOCK	2		;IOWD FOR BF2
POINTR:	BLOCK	2		;IOWD FOR BLKO
RTB:	XWD	1,ADD1		;RTBLK UUO SETUP TO GET ON PI 1.
	XWD	1,ADD2		;FSTBLK MODE
	CONSO	200,DONE
	BLKO	200,POINTR
	0
RTBOFF:	BLOCK	4		;RTBLK UUO SETUP TO GET OFF PI
BF1:	BLOCK	SIZE		;I/O BUFFER FOR SAMPLES
BF2:	BLOCK	SIZE		;I/O BUFFER FOR SAMPLES
STRT:	RESET
	MOVE	SETUP,[EXIT]		;DON'T ALLOW RESTART
	MOVEM	SETUP,STRT
RETRY2:	JSA	16,FILBRK		;GET INPUT FILE NAME
	INIT	DSK,17			;DUMP MODE INPUT
DEV:	0				;DEV FILLED BY FILBRK
	0
	JRST	[
	OUTSTR	[ASCIZ /CAN'T GET INPUT DEVICE?/]
	EXIT]				;EXIT ON DEVICE ERROR
	SKIPE	FNAM			;IF FILE NAME BLANK
	JRST	LKUP			;SET FILE NAME
	MOVE	SETUP,['MUSIC ']	;TO MUSIC.MUS
	MOVEM	SETUP,FNAM
	MOVSI	SETUP,'MUS'
	MOVEM	SETUP,FNAM+1
LKUP:	LOOKUP	DSK,FNAM		;STORAGE FOR FNAME IN FILBRK
	JRST	[
	OUTSTR	[ASCIZ /?CAN'T FIND?/]
	JRST	RETRY2]		;GET NEW NAME ON LOOKUP ERROR
	OUTSTR	[ASCIZ /MODE? /]	;GET MODE FOR DAC OUTPUT
	INCHWL	IO			;PUT IN BITS 18+19 OF CONOWD
	SUBI	IO,60
	DPB	IO,[POINT 2,CONOWD,19]
	CLRBFI		;NO TYPE AHEAD
	OUTSTR	[ASCIZ /CLOCK? /]	;GET CLOCK RATE
	INCHWL	IO			;GET SELECT
	SUBI	IO,60			;PUT IN BITS 28+29
	DPB	IO,[POINT 2,CONOWD,29]
	INCHWL	IO			;GET DIVIDE
	SUBI	IO,60			;PUT IN BITS 20,21+22
	DPB	IO,[POINT 3,CONOWD,22]
	CLRBFI
RETRY1:	MOVE	SETUP,[XWD 1,1]		;LOCK IN CORE
	LOCK	SETUP,			;ON ANY ERROR TYPE 'L'
	JRST	[
	OUTSTR	[ASCIZ /L/]
	INCHRS	IO
	JRST	RETRY1
	EXIT]	;TRY TO LOCK AGAIN, EXIT FROM RETRY LOOP ON TTY INPUT.
	OUTSTR	[ASCIZ /
/]
	HRRZ	SETUP,SETUP		;GET RELOCATION FROM
	LSH	SETUP,9			;LOCK UUO (NORMALIZE)
	MOVEM	SETUP,INDEX		;STORE IN INDEX
	ADDM	SETUP,EXCHWD		;RELOCATE SOME INSTRUCTIONS
	ADDM	SETUP,JENWD
	MOVE	IB1,[IOWD SIZE,BF1]		;CREATE IOWD'S IN ACCS
	MOVE	IB2,[IOWD SIZE,BF2]		;FOR QUIT RESTORE
	MOVEM	IB1,BP1			;SET UP IOWD FOR FIRST READ
	MOVEM	IB1,POINTR		;CREATE IOWD FOR BLKO
	MOVEI	SETUP,INTBLK		;GRAB ↑C
	MOVEM	SETUP,134
	MOVEI	SETUP,RTB		;EXECUTE RTBLK UUO
	RTTRP	SETUP,
	JRST	[
	OUTSTR	[ASCIZ /?NCH?/]
	EXIT]				;EXIT ON ERROR
	MOVE	B1,POINTR		;GET RELOCATE IOWD FOR BUF1
	HRRZ	B2,POINTR		;MODIFY FOR BUF2
	ADDI	B2,SIZE
	HLL	B2,POINTR
	SETZM	MFLG		;LOWER MISSED FLAG
	SETZM	DFLG		;LOWER DONE FLAG
	SETZM	TPOINT		;ZERO NEXT IOWD
	SETZM	WHATBF		;POINT WHATBF TO BUFFER 2
	MOVEI	SETUP,1		;GET IN HPQ 1
	HPQ	SETUP,		;(HIGHER THAN NORMAL TIME SHARING)
	JRST	[
	OUTSTR	[ASCIZ /?CAN'T HPQ?
/]
	JRST	XIT+1]		;EXIT GRACEFULLY ON ERROR
	IN	DSK,BP1		;FILL FIRST BUFFER FROM DSK
	SKIPA
	JRST	XIT		;ASSUME NULL FILE
	CONSZ	200,BUSY		;IS DAC ALREADY ON
	OUTSTR	[ASCIZ /?DAC IS ON?
/]					;YES TELL USER
CONOWD:	CONO	200,STATUS		;START DAC
LOOP:
	SKIPE	DFLG		;IF DONE FLAG IS RAISED HERE - ERROR
	JRST	MISSED		;NEXT IOWD WAS NOT READY
	SKIPE	WHATBF		;WAIT FOR PERMISSION TO FILL BUFFER 2
	JRST	LOOP
	MOVEM	IB2,BP2		;RESTORE INPUT IOWD (NECESSARY FOR MTA)
	IN	DSK,BP2		;READ BUFFER
	SKIPA
	JRST	X1		;AT EOF WAIT FOR DONE FLAG
	MOVEM	B2,TPOINT		;RESTORE NEXT IOWD
LOOP1:	SKIPE	DFLG		;SAME AS ABOVE BUT FOR BUFFER 1
	JRST	MISSED
	SKIPL	WHATBF
	JRST	LOOP1
	MOVEM	IB1,BP1
	IN	DSK,BP1
	SKIPA
	JRST	X1
	MOVEM	B1,TPOINT
	JRST	LOOP
MISSED:	OUTSTR	[ASCIZ /
?COULD NOT READ INPUT FAST ENOUGH?
/]  ;NO NEXT POINTER, THE DONE FLAG WAS RAISED BUT MORE SAMPLES EXISTED.
X1:	SKIPL	DFLG		;WAIT FOR DONE FLAG -- ALL SAMPLES READ
	JRST	.-1
	SKIPE	MFLG	;WAS DATA MISSED (SET IN INTERRUPT ROUTINE)
	OUTSTR	[ASCIZ /?DATA MISSED?
/]				;YES -- TELL USER
	SKIPA
XIT:	OUTSTR	[ASCIZ /?NULL FILE?/]		;TELL USER EOF ON FIRST READ
	MOVEI	SETUP,RTBOFF		;GET OFF PI
	RTTRP	SETUP,
	JFCL		;IGNORE ANY ERROR
	MOVE	SETUP,[XWD 1,1]		;UNLOCK
	UNLOK.	SETUP,
	JFCL		;IGNORE ANY ERRORS
	MOVEI	SETUP,0
	HPQ	SETUP,		;GET BACK TO TIMESHARING LEVEL
	JFCL		;IGNORE ANY ERRORS
	EXIT		;SAY HELLO TO MONITOR
INTLOC:	CONO	200,OFF		;HERE ON ↑C -- TURN OF DEVICE
	JRST	XIT+1		;EXIT GRACEFULLY
	END	STRT